home *** CD-ROM | disk | FTP | other *** search
/ Mac Power 1997 December / MACPOWER-1997-12.ISO.7z / MACPOWER-1997-12.ISO / AMUG / PROGRAMMING / Raven 1.2.sit / Raven 1.2 / Source / Foundation / Common / ZReferenceCounted.cpp < prev    next >
Text File  |  1996-10-28  |  2KB  |  95 lines

  1. /*
  2.  *  File:       ZReferenceCounted.h
  3.  *  Summary:    Mixin class to help with reference counting.
  4.  *  Written by: Jesse Jones
  5.  *
  6.  *  Copyright ゥ 1996 Jesse Jones. 
  7.  *    For conditions of distribution and use, see copyright notice in ZTypes.h  
  8.  *
  9.  *  Change History (most recent first):    
  10.  *
  11.  *         <->     1/14/96    JDJ        Created.
  12.  */
  13.  
  14. #include <ZReferenceCounted.h>
  15.  
  16.  
  17. //---------------------------------------------------------------
  18. //
  19. // MReferenceCounted::~MReferenceCounted
  20. //
  21. //---------------------------------------------------------------
  22. MReferenceCounted::~MReferenceCounted()
  23. {
  24.     // It's legal to delete an object with a ref count of one so
  25.     // that MReferenceCounted objects can be used on the stack.
  26.     ASSERT(mRefCount <= 1);                
  27. }
  28.  
  29.  
  30. //---------------------------------------------------------------
  31. //
  32. // MReferenceCounted::MReferenceCounted
  33. //
  34. //---------------------------------------------------------------
  35. MReferenceCounted::MReferenceCounted(long refCount)
  36. {
  37.     ASSERT(refCount >= 0);
  38.     
  39.     mRefCount = refCount;
  40. }
  41.  
  42.  
  43. //---------------------------------------------------------------
  44. //
  45. // MReferenceCounted::AddReference
  46. //
  47. //---------------------------------------------------------------
  48. void MReferenceCounted::AddReference()
  49. {
  50.     ASSERT(mRefCount >= 0);
  51.     
  52.     if (++mRefCount == 1)
  53.         this->OnFirstReference();
  54. }
  55.  
  56.  
  57. //---------------------------------------------------------------
  58. //
  59. // MReferenceCounted::RemoveReference
  60. //
  61. //---------------------------------------------------------------
  62. void MReferenceCounted::RemoveReference()
  63. {
  64.     ASSERT(mRefCount >= 1);
  65.     
  66.     if (--mRefCount == 0)
  67.         this->OnLastReference();
  68. }
  69.  
  70.  
  71. //---------------------------------------------------------------
  72. //
  73. // MReferenceCounted::OnFirstReference
  74. //
  75. //---------------------------------------------------------------
  76. void MReferenceCounted::OnFirstReference()
  77. {
  78.     ASSERT(mRefCount == 1);
  79. }
  80.  
  81.  
  82. //---------------------------------------------------------------
  83. //
  84. // MReferenceCounted::OnLastReference
  85. //
  86. //---------------------------------------------------------------
  87. void MReferenceCounted::OnLastReference()
  88. {
  89.     ASSERT(mRefCount == 0);
  90.  
  91.     delete this;
  92. }
  93.  
  94.  
  95.